// 把对象转成查询字符串  
// {name:'zhangsan',age:18}  => name=zhangsan&age=18
// key=value& 每个键值对都是这个模板 
// 去掉最后一个&
function object_to_querystring(obj) {
    let str = '';
    for (let k in obj) {
        str += `${k}=${obj[k]}&`
    }
    return str.slice(0, -1)
}


function outer(url){
    let baseURL = url
    return function myajax(options = {}) {

        // 请求方式  可以不传  但是传递 必须是GET POST PUT PATCH DELETE
        if (!(options.method === undefined || /^(GET|POST)$/i.test(options.method))) {
            throw new Error('请求方式仅仅支持GET和POST,敬请期待更新');
        }
        // 请求地址  必须传  
        if (!options.url) {
            throw new Error('请求地址必须传递');
        }
        // 是否是异步 可以不传  但是传递必须是 布尔类型 
        if (!(options.async === undefined || typeof options.async === 'boolean')) {
            throw new Error('aysnc只能是布尔类型 ');
        }
        // 携带参数  可以不传递 但是传递必须是字符串 或者对象 
        if (!(options.data === undefined || typeof options.data === 'string' || options.data.constructor === Object)) {
            throw new Error('data参数只能是string 或者 object 类型 ');
    
        }
        // 请求头  可以不传 但是传递必须是 对象 
        //              {'content-type':'application/x-www-form-urlencoded'}
        if (!(options.headers === undefined || options.headers.constructor === Object)) {
            throw new Error('请求头必须是一个对象结构');
    
        }
    
        // 数据解析 
        //      可以不传   传的话 必须 是 'string'或者'json '
        if (!(options.dataType === undefined || /^(string|json)$/i.test(options.dataType))) {
            throw new Error('datatype必须是string或者json');
        }
    
    
        const _default = {
            method:options.method || 'GET',
            url:baseURL+options.url,
            async:options.async || true,
            data:options.data || '',
            headers:{'content-type':'application/x-www-form-urlencoded',...options.headers},
            dataType:options.dataType || 'string'
        }
    
        //get请求 参数 拼接在url地址后边 
        //也就是需要修改 _default.url
        // 需要在 配置请求信息完成以前 搞定 
    
        //判断是否 get 请求  
        // get请求 并且 data不为空  说明用户携带了参数 
        if(_default.data.constructor === Object){
            _default.data = object_to_querystring(_default.data)
        }
    
        if(/^GET$/i.test(_default.method) && _default.data){
            _default.url += '?'+_default.data
        }
    
        const p1 = new Promise((resolve,reject)=>{
            const xhr = new XMLHttpRequest();
    
            xhr.open(_default.method,_default.url,_default.async);
    
            xhr.onload = function(){
                if(_default.dataType === 'string'){
                    resolve({code:1,message:'成功了666',info:xhr.responseText})
                    return 
                }
    
                try{
                    const res = JSON.parse(xhr.responseText);
                    resolve({code:1,message:'成功了666',info:res})
                }
                catch(e){
                    resolve({code:0,message:'失败了000',info:e})
                }
                finally{
                    console.log('不管你们怎么样,我都会执行');
                }
    
            }
            // 如果是post请求 需要设置请求头 
            if(/^POST$/i.test(_default.method)){
                xhr.setRequestHeader('content-type',_default.headers['content-type'])
            }
    
            if(_default.headers.authorization){
                xhr.setRequestHeader('authorization',_default.headers.authorization)
            }
            // 发送请求 
    
            /^POST$/i.test(_default.method)? xhr.send(_default.data): xhr.send();
           
        });
    
    
        return p1;
    
    }
}

const res = outer('http://localhost:8080');  // myajax函数 

// res({
//     url:'/test/first' 
// }).then(data=>console.log(data))

// myajax({
//     url:'http://localhost:8080/test/first'
// }).then(data=>console.log(data))

// res({
//     url:'/test/second',
//     dataType:'json'
// }).then(data=>console.log(data))


// myajax({
//     url:'http://localhost:8080/test/second',
//     dataType:'json'
// }).then(data=>console.log(data))

// myajax({
//     url:'http://localhost:8080/test/third',
//     data:{name:'zhangsan',age:17},
//     dataType:'json'
// }).then(data=>console.log(data))



// myajax({
//     url:'http://localhost:8080/test/fourth',
//     method:'post',
//     data:{name:'zhangsan',age:77},
//     dataType:'json'
// }).then(data=>console.log(data))



// myajax({
//     url:'http://localhost:8080/goods/list',
//     data:{current:3,pagesize:12},
//     dataType:'json'
// }).then(data=>console.log(data))


async function fn3(){
    const t1 = await res({
        url:'/goods/list',
        data:{current:3,pagesize:12},
        dataType:'json'
    });
    console.log(t1)
}

fn3()

// console.log(await res({
//             url:'/goods/list',
//             data:{current:3,pagesize:12},
//             dataType:'json'
//         }));